#include "change.h"

void add(Node** list,Stu s){
    if(NULL == list) return;

    Node* pNew = chuang(s);
    if(NULL == pNew) return;//异常处理

    Node* pTemp = *list;
    if(*list){//非空
        while(pTemp->pNext) 
        pTemp = pTemp->pNext;//此时 pTemp非NULL pTemp->pNext为NULL 就是尾节点
        pTemp->pNext = pNew;
    }else{
        *list = pNew;
    }

}
void addstu(Node* list,int num){
    system("clear");
    printf("------添加学生信息------\n");
    add(&list,stuinput(num));
    showall(list);
    printf("添加学生信息成功\n");
}
Stu stuinput (int num){
    Stu s;
    /* printf("请输入学生学号:");
    scanf("%d", &(s.id) ); */
    s.id=num+1;
    printf("学生学号：%d",s.id);
    printf("请输入姓名:");
    scanf("%s",s.name);
 
    printf("请输入年龄:");
    scanf("%d",&(s.age));
    getchar();
    printf("请输入性别:");
    scanf("%c",&(s.sex));

    printf("请输入语文成绩:");
    scanf("%lf",&(s.Cscore));
    printf("请输入数学成绩:");
    scanf("%lf",&(s.Mscore));
    printf("请输入英语成绩:");
    scanf("%lf",&(s.Escore));
    return s;
}

void del(Node** list, int num){
    system("clear");
     printf("----学生管理系统----\n");
    printf("通过哪方式来删除:1.学号   2.姓名\n");
    int n;
    scanf("%d",&n);
    
    switch(n){
        case 1: delstuById(num,list);break;
        case 2: delstuByName(list);break;
        default: printf("输入错误，请重新输入:\n");break;
    }
}
void delstuByName(Node** list){
    system("clear");
     printf("----学生管理系统----\n");
    printf("请输入要删除的姓名:\n");
    
         char name [10];
         scanf("%s",name);
         Node* pDel=findNodeByName(*list,name);
        if(NULL==pDel)return;
        
    sss(pDel);
    //2 如果是第一个 特殊处理
    if(pDel==*list){
        *list=pDel->pNext;
        free(pDel);
        pDel=NULL;
        return;
    }
    //3 不是第一个 直接删 前一个节点接后一个节点
    Node* pDelPret=*list;
    //找前一个节点
    while(1){
        if(pDelPret->pNext==pDel)break;
            pDelPret=pDelPret->pNext;
    }
    pDelPret->pNext=pDel->pNext;
    free(pDel);
    pDel=NULL;
   
    printf("删除成功！\n");
    showall(*list);
    
}
void delstuById(int num,Node** list){
    system("clear");
    printf("----学生管理系统----\n");
    printf("请输入要删除的学号:");
    int b;
    while(1){
        scanf("%d",&b);
        if(b<0||b>num){
            printf("输入错误，请重新输入！\n");
        }else break;
    }
    //1 先找到要删的节点
    Node* pDel=findNodeById(*list,b);
    
    if(NULL==pDel)return;
    sss(pDel);
    //2 如果是第一个 特殊处理
    if(pDel==*list){
        *list=pDel->pNext;
        free(pDel);
        pDel=NULL;
        return;
    }
    //3 不是第一个 直接删 前一个节点接后一个节点
    Node* pDelPret=*list;
    //找前一个节点
    while(1){
        if(pDelPret->pNext==pDel)break;
            pDelPret=pDelPret->pNext;
    }
    pDelPret->pNext=pDel->pNext;
    free(pDel);
    pDel=NULL;
   
    printf("删除成功！\n");
    showall(*list);

}


void gai(Node* list, int num){
    system("clear");
     printf("----学生管理系统----\n");
    printf("通过哪方式来改:1.学号   2.姓名\n");
    int n;
    scanf("%d",&n);
    
    switch(n){
        case 1: xiugaiById(num,list);break;
        case 2: xiugaiByName(list);break;
        default: printf("输入错误，请重新输入:\n");break;
    }
}
void xiugaiByName(Node* list){
    system("clear");
     printf("----学生管理系统----\n");
    printf("请输入要修改的姓名:\n");
    
            char name [10];
            scanf("%s",name);
            Node* pChange=findNodeByName(list,name);
            if(NULL==pChange)return;
           sss(pChange);
    printf("学号\t姓名\t年龄\t性别\t语文\t数学\t英语\t总分\t平均分\t\n");
    pChange->s=input();
    printf("修改成功！\n");
    showall(list);
}
void xiugaiById(int num,Node* list){
    system("clear");
    printf("----学生管理系统----\n");
    printf("请输入要改的学号：");
    int b;
    while(1){
        scanf("%d",&b);
        if(b<0||b>num){
            printf("输入错误，请重新输入！\n");
        }else break;
    }
     Node* pChange=findNodeById(list,b);
    
    printf("学号\t姓名\t年龄\t性别\t语文\t数学\t英语\t总分\t平均分\t\n");
    sss(pChange);
    pChange->s=input();
    printf("修改成功！\n");
    showall(list);
}